﻿test("Использование arguments", function(){
	var sum = function(x, y){
		return x + y; 
	};
	var foo = function(){
		return arguments[0] + arguments[1]; 
	};
	
	ok(sum(1, 2) == foo(1, 2), "Должны быть равны");
});

test("Использование Function", function(){
	var sum = function(x, y){
		return x + y; 
	};
	
	var foo1 = new Function("return arguments[0] + arguments[1]");
	var foo2 = new Function("x", "y", "return x + y");
	var foo3 = new Function("x, y", "return x + y");
	
	ok(sum(1, 2) == foo1(1, 2), "Должны быть равны");
	ok(sum(1, 2) == foo2(1, 2), "Должны быть равны");
	ok(sum(1, 2) == foo3(1, 2), "Должны быть равны");
});

test( "calculator должен иметь пустой массив oparators", function(){
	var calc = new calculator();
	ok(calc.operators.length == 0, "Операторы не пустые!" );
});

asyncTest( "asynchronous test: calculator.loadOperator должен загрузить оператор ^", 2, function() {
	var calc = new calculator();
	calc.loadOperator('pow', function(){
		ok(calc.operators['^'] != undefined, "Нет оператора ^" );
		ok(calc.operators['^'].func(2, 3) == 8, "2^3 == 8" );
		start();
	});
});

asyncTest( "asynchronous test: calculator.loadOperator должен загрузить оператор *", 2, function() {
	var calc = new calculator();
	calc.loadOperator('mult', function(){
		ok(calc.operators['*'] != undefined, "Нет оператора *" );
		equal(calc.operators['*'].func(2, 3), 6, "2*3 == 6");
		start();
	});
});

asyncTest( "asynchronous test: calculator.loadOperator должен загрузить оператор /", 2, function() {
	var calc = new calculator();
	calc.loadOperator('div', function(){
		ok(calc.operators['/'] != undefined, "Нет оператора /" );
		equal(calc.operators['/'].func(3, 2), 1.5, "3/2 == 1.5");
		start();
	});
});

asyncTest( "asynchronous test: деление на 0 должен кинуть ошибку", 2, function() {
	var calc = new calculator();
	calc.loadOperator('div', function(){
		ok(calc.operators['/'] != undefined, "Нет оператора /" );
		throws(
			function() {
				calc.operators['/'](4, 0);
			},
			"throws with just a message, no expected"
		);
		start();
	});
});
asyncTest( "asynchronous test: calculator.loadOperator должен загрузить оператор sqrt", 2, function() {
	var calc = new calculator();
	calc.loadOperator('sqrt', function(){
		ok(calc.operators['sqrt'] != undefined, "Нет оператора sqrt" );
		equal(calc.operators['sqrt'].func(4), 2, "sqrt(2) == 2");
		start();
	});
});